package cn.sfa.common.taglib;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import cn.sfa.common.utils.CommonUtil;
import cn.sfa.entity.system.SaleSysCode;

/**
 * 
* 类名称：DictionaryTag2   
* 类描述：字典标签类   
* 创建人：lenovo   
* 创建时间：2012-2-23 上午10:19:55   
* 修改人：lenovo   
* 修改时间：2012-2-23 上午10:19:55   
* 修改备注：   
* @version
 */

public class DictionaryTag2 extends TagSupport{

	/**
	 * 
	 */
	private static final long serialVersionUID = -6890931535767339528L;
	
	
	// 字典种类编号(代码分类 )
    String kindNo;
    // 显示类型(如select标签类型)
    String showType;
    // 字典子项值(记录ID)
    String code;
    // 生成标签名字
    String name;
    // 生成标签id
    String id;
    /**
     * 静态字典串，格式code:name;code:name
     */
    String def;
    // 标签属性
    String attr;
	public String getKindNo() {
		return kindNo;
	}
	public void setKindNo(String kindNo) {
		this.kindNo = kindNo;
	}
	public String getShowType() {
		return showType;
	}
	public void setShowType(String showType) {
		this.showType = showType;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getDef() {
		return def;
	}
	public void setDef(String def) {
		this.def = def;
	}
	public String getAttr() {
		return attr;
	}
	public void setAttr(String attr) {
		this.attr = attr;
	}
	
	/**
	 * 标签开始方法
	 */
	@Override
	public int doStartTag() throws JspException {

		// jsp页面代码字符
		StringBuilder outJspStr = new StringBuilder();
		
		//显示方式判断
		
		if(CommonUtil.isEmpty(this.showType)){//无显示方式
			
			outJspStr.append("缺失显示方式选择有效值，字典标签显示失败");
			
		}else if("value".equals(this.showType)){
			// 显示方式为"value"，即只显示字典意思
			
			//if(!CommonUtil.isEmpty(this.kindNo) && !CommonUtil.isEmpty(this.code)){
			
			if(!CommonUtil.isEmpty(this.code)){	
				//根据kindNo与code查找数据库信息
				outJspStr.append(DictionaryCache2.getInstance().getSysDicItemMean(code));
			}
			
			 // 从def中取值
		    if (!CommonUtil.isEmpty(this.def) && !CommonUtil.isEmpty(this.code)) {
				String[] options = this.def.split(";");
				// 循环查找
				for (String option : options) {
				    String[] optionItem = option.split(":");
				    if (optionItem[0].equals(this.code)) {// 比较值
					outJspStr.append(optionItem[1]);// 显示含义
					break;// 退出循环
				    }
				}
		    }
		}else if (this.showType.equals("select")) {
			// 显示方式为"select"，即下拉框
			// 先构造<select>标签信息
		    outJspStr.append("<select id=\""
			    + CommonUtil.jugeAndFixNull(this.id) + "\" name=\""
			    + CommonUtil.jugeAndFixNull(name) + "\" "
			    + CommonUtil.jugeAndFixNull(attr) + ">");
		    
		    // --------------------循环构造其子标签<option>
		    // 定义之际子标签对象集
		    List<SaleSysCode> itemList = new ArrayList<SaleSysCode> ();
		    // 判断是否设置默认项
		    if (!CommonUtil.isEmpty(this.def)) {
			// 非空则进行相应设置，已明确不需要默认选项
			if (this.def.indexOf(":") > 0) {// 有自定义标识，设置默认自定义选项
			    String[] options = this.def.split(";");
			    for (String option : options) {
				String[] optionItem = option.split(":");
				outJspStr.append("<option value=\"" + optionItem[0]
					+ "\"");
				// 判断code是否有值，有则将与值相等的标签选定
				
				if (this.code != null
					&& this.code.equals(optionItem[0].toString())) {
				    outJspStr.append(" selected=\"selected\"");
				}
				outJspStr.append(">" + optionItem[1] + "</option>");
			    }
			}
		    } else {
			//outJspStr.append("<option value=\"\">全部</option>");// 加入默认项
		    }
		    
		    if (this.kindNo != null) {// 非静态，从缓存获取
				// 获取子标签数据
				itemList = DictionaryCache2.getInstance().getSysDicItemsByKindNo(kindNo);
			}
		    
		    // 循环构造
		    if (itemList != null) {
			for (SaleSysCode sysCode : itemList) {
			    outJspStr.append("<option value=\""
				    + sysCode.getSaleRecordId() + "\"");
			    // 判断code是否有值，有则将与值相等的标签选定
			    if (!CommonUtil.isEmpty(code) && !CommonUtil.isEmpty(sysCode.getSaleRecordId()) 
					    && (code.equals(sysCode.getSaleRecordId()))) {
				outJspStr.append(" selected=\"selected\"");
			    }
			    outJspStr.append(">" + sysCode.getChnName()
				    + "</option>");
			}
		    }
		    outJspStr.append("</select>");// 结束</select>标签
		    
			
		}else if (this.showType.equals("radio")) {
		    // <input name="radiobutton" type="radio" value="radiobutton"
		    // checked="checked" />
		    List<SaleSysCode> itemList = null;
		    // 获取子标签数据
		    // 判断是否为静态字典，子项由页面传入
		    if (!CommonUtil.isEmpty(this.def)) {
			// 先从def中取
			//if (this.def.indexOf(";") > 0 && this.def.indexOf(":") > 0) {// 有自定义标识，设置默认自定义选项
		    if (this.def.indexOf(":") > 0) {// 有自定义标识，设置默认自定义选项
			    String[] options = this.def.split(";");
			    for (String option : options) {
				String[] optionItem = option.split(":");
				outJspStr.append("<input type=\"radio\" id=\""
					+ CommonUtil.jugeAndFixNull(optionItem[0])+this.name
					+ "\" name=\""
					+ CommonUtil.jugeAndFixNull(name)
					+ "\" value=\"" + optionItem[0] + "\" "
					+ CommonUtil.jugeAndFixNull(attr));
				if (this.code != null
					&& this.code.equals(optionItem[0])) {
				    outJspStr.append(" checked=\"checked\"");
				}
				outJspStr.append(" />").append("<label for='"+optionItem[0]+this.name+"'>"+optionItem[1]+"</label>"+
					"&nbsp;");
			    }
			}
		    }
		    if (this.kindNo != null) {// 非静态，从缓存获取
			// 获取子标签数据
			itemList = DictionaryCache2.getInstance().getSysDicItemsByKindNo(kindNo);
		    }
		    if (itemList != null) {
			for (SaleSysCode sysCode : itemList) {
			    outJspStr.append("<input type=\"radio\" id=\""
				    + CommonUtil.jugeAndFixNull(sysCode.getSaleRecordId()+this.name) + "\" name=\""
				    + CommonUtil.jugeAndFixNull(name) + "\" value=\""
				    + sysCode.getSaleRecordId() + "\" "
				    + CommonUtil.jugeAndFixNull(attr));
			    if (this.code != null
				    && this.code.equals(sysCode.getSaleRecordId()
					    .toString())) {
				outJspStr.append(" checked=\"checked\"");
			    }
			    outJspStr.append(" />").append("<label for='"+sysCode.getSaleRecordId()+this.name+"'>"+sysCode.getChnName()+"</label>")
				    .append("&nbsp;");
			}
		    }
		}else if (this.showType.equals("checkbox")) {
		    // <input name="cb" type="checkbox" value="cb"
		    // checked="checked" />
		    List<SaleSysCode> itemList = null;
		    // 获取子标签数据
		    // 判断是否为静态字典，子项由页面传入
		    if (!CommonUtil.isEmpty(this.def)) {
			// 先从def中取
			if (this.def.indexOf(":") > 0) {// 有自定义标识，设置默认自定义选项
			    String[] options = this.def.split(";");
			    for (String option : options) {
				String[] optionItem = option.split(":");
				outJspStr.append("<input type=\"checkbox\" id=\""
					+ CommonUtil.jugeAndFixNull(optionItem[0])+this.name
					+ "\" name=\""
					+ CommonUtil.jugeAndFixNull(name)
					+ "\" value=\"" + optionItem[0] + "\" "
					+ CommonUtil.jugeAndFixNull(attr));
				if (this.code != null
					&& this.code.equals(optionItem[0])) {
				    outJspStr.append(" checked=\"checked\"");
				}
				outJspStr.append(" />").append("<label for='"+optionItem[0]+this.name+"'>"+optionItem[1]+"</label>"+
					"&nbsp;");
			    }
			}
		    }
		    if (this.kindNo != null) {// 非静态，从缓存获取
			// 获取子标签数据
			itemList = DictionaryCache2.getInstance().getSysDicItemsByKindNo(kindNo);
		    }
		    if (itemList != null) {
			for (SaleSysCode sysCode : itemList) {
			    outJspStr.append("<input type=\"checkbox\" id=\""
				    + CommonUtil.jugeAndFixNull(sysCode.getSaleRecordId()+this.name) + "\" name=\""
				    + CommonUtil.jugeAndFixNull(name) + "\" value=\""
				    + sysCode.getSaleRecordId() + "\" "
				    + CommonUtil.jugeAndFixNull(attr));
			    
			    if (this.code != null) {
			    	if(this.code.indexOf(",") > 0){
				    	String[] str = this.code.split(",");
				    	for(String s : str){
						    if (s.equals(sysCode.getSaleRecordId()
								    .toString())) {
						    	outJspStr.append(" checked=\"checked\"");
						    }
						    	
				    	}
			    	}else if(this.code.equals(sysCode.getSaleRecordId()
						    .toString())) {
						outJspStr.append(" checked=\"checked\"");
			    		
			    	}
				}
			    outJspStr.append(" />").append("<label for='"+sysCode.getSaleRecordId()+this.name+"'>"+sysCode.getChnName()+"</label>")
			    .append("&nbsp;");
	    	}
		    }
		}
		
		JspWriter out = pageContext.getOut();
		try {
		    // 输出到页面
		    out.println(outJspStr.toString());
		} catch (IOException e) {
		    // 打印错误信息
		    System.out.println("DictionaryTag输出到jsp错误:");
		    e.printStackTrace();
		}
		
		return 0;
	}
   
	/**
	 * 结束标签方法
	 */
	@Override
	public int doEndTag() throws JspException {
		return 6;
	}
}
